home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung (Tewi)(1994).iso
/
magazine
/
nan_news
/
toolkit
/
sqzn.prg
< prev
next >
Wrap
Text File
|
1991-08-15
|
4KB
|
140 lines
/*
* File......: SQZN.PRG
* Author....: Joseph D. Booth, Sr.
* CIS ID....: 72040,2112
* Date......: $Date: 15 Aug 1991 23:04:38 $
* Revision..: $Revision: 1.1 $
* Log file..: $Logfile: E:/nanfor/src/sqzn.prv $
*
* This is an original work by Joseph D. Booth Sr. and is placed in the
* public domain.
*
* Modification history:
* ---------------------
*
* $Log: E:/nanfor/src/sqzn.prv $
*
* Rev 1.1 15 Aug 1991 23:04:38 GLENN
* Forest Belt proofread/edited/cleaned up doc
*
* Rev 1.0 13 Jun 1991 15:21:36 GLENN
* Initial revision.
*
*/
/* $DOC$
* $FUNCNAME$
* FT_SQZN()
* $CATEGORY$
* Conversion
* $ONELINER$
* Compress a numeric value into a character string
* $SYNTAX$
* FT_SQZN( <nValue> [, <nSize> [, <nDecimals> ] ] ) -> cCompressed
* $ARGUMENTS$
* nValue - The numeric value to be compressed
* nSize - Optional size of numeric field, defaults to 10
* nDecimals - Optional number of decimal places, defaults to 0
* $RETURNS$
* cCompressed - Compressed string, 50% the size of nSize
* $DESCRIPTION$
*
* The FT_SQZN function allows a numeric value to be compressed when
* stored in the database. The compression is 50% the storage space
* of the original number. The companion function, FT_UNSQZN returns
* the original number from the compressed string.
*
* $EXAMPLES$
*
* replace TRANS->cust_id with FT_SQZN(mcust_id,8),;
* TRANS->amount with FT_SQZN(mamount,12,2)
*
* $SEEALSO$
* FT_UNSQZN()
* $INCLUDE$
*
* $END$
*/
function ft_sqzn(nValue,nSize,nDecimals)
local tmpstr,cCompressed,k
nSize := if(nSize ==NIL,10,nSize )
nDecimals := if(nDecimals==NIL, 0,nDecimals )
nValue := nValue * (10**nDecimals)
nSize := if(nSize/2<>int(nSize/2),nSize+1,nSize)
tmpstr := str( abs(nValue),nSize )
tmpstr := strtran(tmpstr," ","0")
cCompressed := chr( val(substr(tmpstr,1,2))+if(nValue<0,128,0) )
for k := 3 to len(tmpstr) step 2
cCompressed += chr(val(substr(tmpstr,k,2)))
next
return cCompressed
/* $DOC$
* $FUNCNAME$
* FT_UNSQZN()
* $CATEGORY$
* Conversion
* $ONELINER$
* Uncompress a numeric compressed by FT_SQZN()
* $SYNTAX$
* FT_UNSQZN( <cCompressed>, <nSize> [, <nDecimals> ] ) -> nValue
* $ARGUMENTS$
* <cCompressed> - Compressed string, obtained from FT_SQZN()
*
* <nSize> - Size of numeric field
*
* <nDecimals> - Optional number of decimal places
* $RETURNS$
* nValue - Uncompressed numeric value
* $DESCRIPTION$
*
* The FT_UNSQZN function returns the numeric value from the compressed
* string. The compression is 50% the storage space of the original
* number. The original number must have been compressed using the
* FT_SQZN() function.
*
* This function, along with FT_SQZN() can be used to reduce disk storage
* requirements for numeric fields in a database file.
*
* $EXAMPLES$
*
* mcust_id := FT_UNSQZN(TRANS->cust_id,8),;
* mamount := FT_UNSQZN(TRANS->amount,12,2)
*
* $SEEALSO$
* FT_SQZN()
* $INCLUDE$
*
* $END$
*/
function ft_unsqzn(cCompressed,nSize,nDecimals)
local tmp:="",k,cValue,multi:=1
nSize := if(nSize ==NIL,10,nSize )
nDecimals := if(nDecimals==NIL, 0,nDecimals)
cCompressed := if(multi ==-1,substr(cCompressed,2),cCompressed)
nSize := if(nSize/2<>int(nSize/2),nSize+1,nSize)
if asc(cCompressed) > 127
tmp := str(asc(cCompressed)-128,2)
multi := -1
else
tmp := str(asc(cCompressed),2)
endif
for k := 2 to len(cCompressed)
tmp += str(asc(substr(cCompressed,k,1)),2)
next
tmp := strtran(tmp," ","0")
cValue := substr(tmp,1,nSize-nDecimals)+"."+substr(tmp,nSize-nDecimals+1)
return val(cValue) * multi